package com.can;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.joda.time.DateTime;
import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * HSSF 03版
 * XSSF 07版
 * SXSS 07版升级
 */
public class ExcelWriteTest {

    //路径注意设置成自己的
    String PATH ="D:\\练习项目idea(不可删)\\练习学习项目\\Excel\\can-poi\\";

    /**
     * 03版本
     */
    @Test
    public void HSSFWrite03(){
        //1、创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2、创建一个工作表
        Sheet sheet = workbook.createSheet("CanPOI练习表03");
        //3、创建一个行  (1,1)
        Row row_1 = sheet.createRow(0); //0代表第一行
        //4、创建一个单元格
        Cell cell_1_1 = row_1.createCell(0);//0代表第一列
        cell_1_1.setCellValue("大家加油呀"); //第一行第一列插入数据
        Cell cell_1_2 = row_1.createCell(1);//1代表第二列
        cell_1_2.setCellValue(666);//第一行的第二列插入数据

        //第二行
        Row row_2 = sheet.createRow(1); //创建第二行
        //(2,1)
        Cell cell_2_1 = row_2.createCell(0); //创建第二行第一列
        cell_2_1.setCellValue("第二行第一列");
        Cell cell_2_2 = row_2.createCell(1); //第二行第二列
        String date = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell_2_2.setCellValue(date);

        //生产一张表(IO流)
        //03版本就是使用 xls结尾！
        try(FileOutputStream fileOutputStream = new FileOutputStream(PATH + "CanPOI练习表03版本.xls");) {
            //输出
            workbook.write(fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("CanPOI练习表03版本.xls 生产完毕！");
    }


    /**
     * 07版本
     */
    @Test
    public void XSSFWrite07(){
        //1、创建一个工作簿 07
        Workbook workbook = new XSSFWorkbook();
        //2、创建一个工作表
        Sheet sheet = workbook.createSheet("CanPOI练习表07");
        //3、创建一个行  (1,1)
        Row row_1 = sheet.createRow(0); //0代表第一行
        //4、创建一个单元格
        Cell cell_1_1 = row_1.createCell(0);//0代表第一列
        cell_1_1.setCellValue("大家加油呀"); //第一行第一列插入数据
        Cell cell_1_2 = row_1.createCell(1);//1代表第二列
        cell_1_2.setCellValue(666);//第一行的第二列插入数据

        //第二行
        Row row_2 = sheet.createRow(1); //创建第二行
        //(2,1)
        Cell cell_2_1 = row_2.createCell(0); //创建第二行第一列
        cell_2_1.setCellValue("第二行第一列");
        Cell cell_2_2 = row_2.createCell(1); //第二行第二列
        String date = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
        cell_2_2.setCellValue(date);

        //生产一张表(IO流)
        //07版本就是使用 xlsx结尾！
        try(FileOutputStream fileOutputStream = new FileOutputStream(PATH + "CanPOI练习表07版本.xlsx");) {
            //输出
            workbook.write(fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("CanPOI练习表03版本.xls 生产完毕！");
    }

    /**
     * 03版本 大数据量
     */
    @Test
    public void HSSFWrite03BigData(){
        //开始时间
        long begin = System.currentTimeMillis();

        //创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建表
        Sheet sheet = workbook.createSheet("HSSF 03版大数据量");
        //写入数据
        for (int rowNum = 0; rowNum < 65536; rowNum++) { //超过65536 会有异常 java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }

        System.out.println("over");

        //1.7新特性 自动关闭流 try(流)
        try(FileOutputStream fileOutputStream = new FileOutputStream(PATH + "HSSF-03版大数据量.xls");
        ) {
            workbook.write(fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //结束时间
        long end = System.currentTimeMillis();
        System.out.println( (double) (end-begin)/1000); //1.922
    }

    /**
     * 07版本 大数据量
     * 耗时较长！优化，缓存
     */
    @Test
    public void XSSFWrite07BigData(){
        //开始时间
        long begin = System.currentTimeMillis();

        //创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        //创建表
        Sheet sheet = workbook.createSheet("XSSF 07版大数据量");
        //写入数据
        for (int rowNum = 0; rowNum < 65537; rowNum++) { //07版本 没有 65536行限制
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }

        System.out.println("over");

        //1.7新特性 自动关闭流 try(流)
        try(FileOutputStream fileOutputStream = new FileOutputStream(PATH + "XSSF-07版大数据量.xlsx");
        ) {
            workbook.write(fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //结束时间
        long end = System.currentTimeMillis();
        //耗时较长
        System.out.println( (double) (end-begin)/1000); //8.305
    }

    /**
     * 07 升级版本 大数据量
     */
    @Test
    public void SXSSFWrite07BigData(){
        //开始时间
        long begin = System.currentTimeMillis();

        //创建一个工作簿
        Workbook workbook = new SXSSFWorkbook();
        //创建表
        Sheet sheet = workbook.createSheet("XSSF 07版大数据量");
        //写入数据
        for (int rowNum = 0; rowNum < 65537; rowNum++) { //07版本 没有 65536行限制
            Row row = sheet.createRow(rowNum);
            for (int cellNum = 0; cellNum < 10; cellNum++) {
                Cell cell = row.createCell(cellNum);
                cell.setCellValue(cellNum);
            }
        }

        System.out.println("over");

        //1.7新特性 自动关闭流 try(流)
        try(FileOutputStream fileOutputStream = new FileOutputStream(PATH + "SXSSF-07版大数据量.xlsx");
        ) {
            workbook.write(fileOutputStream);

            //清除临时文件！
            ((SXSSFWorkbook) workbook).dispose();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //结束时间
        long end = System.currentTimeMillis();
        //耗时较长
        System.out.println( (double) (end-begin)/1000); //2.592
    }
}
